fn main() {
    
    // 阻塞当前线程，运行异步到吗
    smol::block_on(
        async {
            smol::Timer::after(std::time::Duration::from_secs(10)).await; // 休眠2秒
            println!("async1");
        }
    );
    
    // 上面block_on会阻塞当前线程，所以下面这行代码知道上面执行完，才会执行。
    println!("Hello, world!");
    
    // 结合子线程使用
    let thread1_handle = std::thread::Builder::new().name("thread1".into()).spawn (|| {
        println!("我是系统子线程： thread1");
        
        // 阻塞了子线程，并没有阻塞主线程
        smol::block_on(
            async {
                smol::Timer::after(std::time::Duration::from_secs(5)).await; // 休眠5秒
                println!("async2");
            }
        );
        
        println!("thread1 end");
    }).unwrap();
    
    println!("main after sub thread Hello, world!"); // 这句会在thread1之前执行。
    // 这里要阻塞主线程，否则主线程过早退出，那么上面的thread1也会过早退出，无法完整执行上面子线程异步代码。
    // std::thread::sleep(std::time::Duration::from_secs(10));
    thread1_handle.join().unwrap(); // 主线程等待子线程
    println!("main end!");
}